package collect

import (
	"context"
	"github.com/1141520944/go-library/library/log"
	"github.com/fsnotify/fsnotify"
	"github.com/hpcloud/tail"
	"os"
	"sync"
	"time"
)

const (
	IndexFile  = "_index.txt"
	NoComplete = -1 + iota
	Complete
	Add
	Delete
	Update
	None
	FileCreate
	FileEdit
	FileRemove
)

// fileIO 文件io
type fileIO struct {
	files     []*os.File //io
	offset    []int64    //文件读取的偏移
	mu        sync.Mutex
	indexIO   sync.Map // files-索引
	Create    chan *Create
	readCount sync.Map //记录文件读取 (是否是第一次) 空行
	cxt       context.Context
	log       *log.Logger
}
type Create struct {
	Path   string
	Offset int64
}

// fileTail 每一个文件夹下只会有一个文件被tail -f
type fileTail struct {
	tails     []*tail.Tail // IO
	indexT    sync.Map     // 索引
	Create    chan Create  //创建
	IndexInfo []*Index     //文件索引
	//indexI    sync.Map          // 索引
	Result   chan *SendLogInfo //日志消息
	IndexMsg chan *Index       //文件索引消息
	log      *log.Logger
	ctx      context.Context
}

// Index 索引文件
type Index struct {
	Name   string `json:"name,omitempty"`   //index文件
	Time   string `json:"time,omitempty"`   //时间
	Row    int    `json:"row,omitempty"`    //行
	Offset int64  `json:"offset,omitempty"` //已经读取过的字节 偏移量
	Status int    `json:",omitempty"`       //文件状态
}

// SendLogInfo http发送的信息
type SendLogInfo struct {
	Timestamp time.Time `json:"@timestamp"`
	Log       struct {
		Offset int `json:"offset"`
		File   struct {
			Path string `json:"path"`
		} `json:"file"`
	} `json:"log"`
	Message string `json:"message"` // 日志的信息
}

// fileListen 操作文件监听
type fileListen struct {
	watcher *fsnotify.Watcher
	paths   []string
	Opt     chan fOpt  //操作watch
	Info    chan fInfo //与watch 服务通信
	ctx     context.Context
	log     *log.Logger
}
type fOpt struct {
	sign int
	data string
}
type fInfo struct {
	event fsnotify.Event
	err   error
	path  string
	time  string
	Sign  int
}
